window.Intent = window.Intent || window.WebKitIntent;
window.navigator.startActivity = window.navigator.startActivity || window.navigator.webkitStartActivity;

jQuery(window).load(function(){
    handleEventRegistration();
    handleAutocomplete();
    handleMailingForm();
    handleIntentShareButtons();
    handlePastEventsLoad();
    handleUserMenu();
    handleGPlusEventsView();
});

function handleUserMenu(){
    checkSession(function(uid){
        var menu = jQuery('#sidebar .userMenu');
        var content = jQuery('.content',menu);
        if(!uid.i){
            var loginUrl = menu.data('login');
            content.append('<a href="'+loginUrl+'">Zaloguj</a>');
        } else {
            var logoutUrl = menu.data('logout');
            if(uid.g){
                var thumb = jQuery('<div class="user-thumb"/>');
                var url = thumb.append('<a href="https://plus.google.com/'+uid.g+'"/>');
                url.append('<img src="https://www.google.com/s2/photos/profile/'+uid.g+'" height="40" />');
                content.append(thumb);
            } else if(uid.f){
                
                var url = jQuery('<a href="//www.facebook.com/'+uid.f+'"/>');
                url.append('<img src="https://graph.facebook.com/'+uid.f+'/picture" height="40" />');
                content.append(thumb);
            }
            content.append('<a href="'+logoutUrl+'">Wyloguj</a>');
        }
        menu.removeClass('hidden');
    });
}

function handleEventRegistration(){
    var eventsButtons = jQuery('*[data-eventid]');
    var events = [];
    eventsButtons.each(function(){
        var button = jQuery(this);
        var eventId = button.data('eventid');
        events[events.length] = eventId;
    });
    checkRegistrations(events,eventsButtons);
    
    eventsButtons.click(function(e){
        e.preventDefault();
        var button = jQuery(this);
        if(button.data('check-in-progress')) return;
        button.data('check-in-progress', true);
        
        var isRegistered = button.data('isRegistered'); //true if already is registered
        
        var _openDialog = function(x,y,anchor){
            var button = document.createElement('a');
            button.className = 'gbutton green';
            button.innerHTML = 'zaloguj się';
            button.href = '/users/login?continue='+encodeURIComponent(location.pathname);
            var wrapper = openDialog('Musisz się zalogować',
                'Musisz się zalogować aby zarejestrować się na spotkanie.<br/>',
                [button]);
            wrapper.addEventListener('dialog-opened', function(e){
                anchor.data('dialog-opened', false);
            }, true);
            wrapper.style.top = (y-20)+'px';
            wrapper.style.left = (x-20)+'px';
            anchor.data('dialog-opened', true);
        };
        
        checkSession(function(uid){
            button.data('check-in-progress', false);
            if(!uid.i){
                if(jQuery(this).data('dialog-opened')) return;
                _openDialog(e.clientX,e.clientY, button);
                return;
            }
            
            var eventid = button.data('eventid');
            if(!isRegistered){
                registerForEvent(eventid, button);
            } else {
                unregisterEvent(eventid, button);
            }
        });
    });
    
}

function checkRegistrations(events, eventsButtons){
    var cpl = function(){
        eventsButtons.each(function(){
            jQuery(this).removeClass('hidden');
        });
    };
    checkSession(function(uid){
        if(!uid.i){
            cpl();
            return;
        }
        jQuery.post('/events/state.json', {'data[Registration][id]': events}, function(resp){
            if(resp&&resp.registered){
                var size = resp.registered.length;
                for(var i=0; i<size; i++){
                    var event_id = resp.registered[i];
                    var button = jQuery('*[data-eventid="'+event_id+'"]');
                    if(button.length === 0) continue;
                    setRegistrationButtonAsRegistered(button);
                }
            }
        }).complete(function(){
            cpl();
        });
    });
    
}

function setRegistrationButtonAsRegistered(button){
    button.data('isRegistered', true);
    button.html('Nie chcę już tam być');
    button.removeClass('button-blue');
}


function openDialog(dialogTitle, content, buttons){
    var d = document;
    var wrapper = d.createElement("div");
    wrapper.setAttribute('role', 'dialog');
    wrapper.className = 'app-dialog-wrapper';
    var container = d.createElement('div');
    container.className = 'app-dialog-container';
    wrapper.appendChild(container);
    var title = d.createElement('h1');
    title.className = 'app-dialog-title';
    title.innerHTML = dialogTitle;
    
    var desc = d.createElement('section');
    desc.className = 'app-dialog-content';
    
    if(typeof content === 'string'){
        var expl = d.createElement('p');
        expl.innerHTML = content;
        desc.appendChild(expl);
    } else {
        for(var i=0; i<content.length; i++ ){
            desc.appendChild(content[i]);
        }
    }
    
    if(buttons && buttons instanceof Array){
        var buttonBar = d.createElement('div');
        buttonBar.className = 'app-dialog-buttonbar';
        for(var i=0; i<buttons.length; i++ ){
            buttonBar.appendChild(buttons[i]);
        }
        desc.appendChild(buttonBar);
    }

    container.appendChild(title);
    container.appendChild(desc);

    var deleteHandler = d.createElement("span");
    deleteHandler.className = 'app-dialog-close';
    deleteHandler.innerHTML = 'x';
    wrapper.appendChild(deleteHandler);
    d.body.appendChild(wrapper);
    deleteHandler.addEventListener('click', function(e){
        d.body.removeChild(wrapper);
        var evt = document.createEvent("Event");
        evt.initEvent('dialog.close', true, true);
        wrapper.dispatchEvent(evt);
    }, false);
    return wrapper;
}

function registerForEvent(eventId, button){
    jQuery.get('/events/register/'+eventId+'.json', function(resp){
        if(resp.result){ //OK
            setRegistrationButtonAsRegistered(button);
            var str = 'Zostałeś zarejestrowany na spotkanie.<br/>';
            if(resp.form){//user should fill additional form
                str += 'Aby przygotować prezentacje na lepszym poziomie<br/>' +
                    '<b>odpowiedz nam na kilka pytań</b>: <br/>' +
                    '<a target="_blank" href="https://docs.google.com/spreadsheet/viewform?formkey='+resp.form+'">otwórz formularz</a>';
                openDialog('Sukces! :)',str);
            }
        } else {
            alert(resp.error);
        }
    })
    .error(function(e) {
        console.error("error",e);
        var message = '';
        switch(e.status){
            case 403:message = 'Zaloguj się!';break;
            case 404:message = 'Nie znaleziono wydarzenia!';break;
            default:message = 'Nieznany błąd!';break;
        }
        alert(message);
    });
}
function unregisterEvent(eventId, button){
    function handleError(){
        openDialog('Błąd :(', 'Spróbuj ponownie później');
    }
    jQuery.get('/events/unregister/'+eventId+'.json', function(resp){
        if(resp.result){
            button.data('isRegistered', false);
            button.html('Chcę tam być');
            button.addClass('button-blue');
        } else {
            handleError();
        }
    }).error(function(){
        handleError();
    });
}
/**
 * This check for session on server and cache results on client.
 * Each futurer request is checked for users session on server side. It's only helper to build client view.
 * @param {Function} callback Callback function to call.
 */
function checkSession(callback){
    window.gdgcache = window.gdgcache || {};
    if(window.gdgcache && window.gdgcache.uid){
        callback(window.gdgcache);
        return;
    }
    jQuery.getJSON('/users/id.json', function(data){
        window.gdgcache = data;
        callback(data);
    });
}

function handleAutocomplete(){
    jQuery('input.autocomplete').each(function(){
        var el = jQuery(this);
        var source = null;
        var selectFn = null;
        switch(el.data('acpl')){
            case 'place':
                source = '/admin/places/find.json';
                selectFn = placeAutocompleteCallback;
                break;
        }
        if(source){
            el.autocomplete({
                minLength   : 1,
                source      : source,
                select      : selectFn,
                html        : true
            });
        }
    });
}
function placeAutocompleteCallback(event, itemData){
    event.preventDefault();
    var input = jQuery(event.target);
    var form = jQuery(input).parents('form');
    var placeIdField = jQuery('#EventPlaceId',form);
    if(!input.data('changeObserved')){
        input.data('changeObserved',true);
        function onChange(e){
            placeIdField.val('');
        }
        input.change(onChange);
        jQuery('#PlaceUrl',form).change(onChange);
        jQuery('#AddressCity',form).change(onChange);
        jQuery('#AddressPostal',form).change(onChange);
    }
    
    
    input.addClass('loading');
    var placeId = itemData.item.value;
    jQuery.get('/admin/places/get/'+placeId+'.json',function(data){
        input.val(data.Place.name);
        if(data.Place.url)
            jQuery('#PlaceUrl',form).val(data.Place.url);
        if(data.Address.city)
            jQuery('#AddressCity',form).val(data.Address.city);
        if(data.Address.city)
            jQuery('#AddressPostal',form).val(data.Address.postal);
        placeIdField.val(placeId);
        input.removeClass('loading');
    });
}
function handleMailingForm(){
    jQuery('form.mailing-form').submit(function(e){
        e.preventDefault();
        
        var posX = e.target.offsetLeft;
        var posY = e.target.offsetTop;
        
        var email = jQuery('#MailingEmail',this).val();
        if(email === ''){
            var d = jQuery(openDialog('Damn it, Jim!','Wpisz przynajmniej adres email!'));
            //I know McCoy has never said this quote :)
            //http://en.wikiquote.org/wiki/List_of_misquotations
            posX -= d.width();
            posY -= d.height();
            d.css({left:posX,top:posY});
            return;
        }
        
        
        jQuery.post('/users/mailing/set.json', {'data[Mailing][email]':email}, function(data){
            if(data.active === true){ //OK
//                var _openDialog = function(x,y,anchor){
//                    var button = document.createElement('a');
//                    button.className = 'button';
//                    button.innerHTML = 'zaloguj się';
//                    button.href = '/users/login';
//                    var wrapper = openDialog('Musisz się zalogować',
//                        'Musisz się zalogować aby zarejestrować się na spotkanie.<br/>',
//                        [button]);
//                    wrapper.addEventListener('dialog-opened', function(e){
//                        anchor.data('dialog-opened', false);
//                    }, true);
//                    wrapper.style.top = (y-20)+'px';
//                    wrapper.style.left = (x-20)+'px';
//                    anchor.data('dialog-opened', true);
//                }
                //TODO: suggest newsletter type (let user select he's chapter)
                openDialog('Zostałeś dopisany do bazy mailingowej.', 'Dziękujemy.');
            } else if(data.active === false){
                openDialog('Zostałeś dopisany do bazy mailingowej.', 'Jeszcze musisz potwierdzić swój adres email. Inaczej nie wyślemy ci niczego :(');
            } else if(data.email){  //validation error
                openDialog('Ktoś popełnił błąd :(','Programista albo ty. <br/>Wiadomość serwisowa: ' + data.email[0]);
            } else {
                openDialog('Ktoś popełnił błąd :(','I to raczej na pewno był programista :(<br/>Nie wiem czy zostałeś dopisany do mailingu bo serwer nic mi nie zwrócił...');
            }
        }).error(function(e){
            
            if(e.status === 400){
                openDialog('Ten email już otrzymuje newsletter','Bardziej dopisać do bazy danych już nie możemy więc niech zostanie tak jak jest :)');
                return;
            }
            
            console.error(e,this);
            var msg = e.statusText;
            try{
                var data = JSON.parse(e.responseText);
                if(data.name){
                    msg = data.name;
                }
            } catch(e1){}
            openDialog('Ktoś popełnił błąd :(','I to raczej na pewno był programista bo serwer odpowiedział błędem :(<br/>Status: ' + e.status + ', Status text: ' + msg);
        });
    });
}
function handleIntentShareButtons(){
    if(!Modernizr.webintents) return;
    
    var eventsButtons = jQuery('.share-button-intent');
    $(document).on('click', '.share-button-intent', function(e){
        var button = jQuery(this);
        e.preventDefault();
        var url = button.data('url');
        var param = { 
            "action": "http://webintents.org/share", 
            "type": "text/uri-list" , 
            "data": url 
        };
        var i = new WebKitIntent(param);
        var onSuccess = function(data) {console.log('shared', data);};
        var onFailure = function() {console.log('error share');};
        navigator.webkitStartActivity(i, onSuccess, onFailure);
    });
    eventsButtons.each(function(){
        var button = jQuery(this);
        button.removeClass('hidden');
    });
}
function handlePastEventsLoad(){
    var buttons = jQuery('.past-events-load');
    buttons.click(function(e){
        e.preventDefault();
        
        var button = jQuery(this);
        if(button.data('disabled')) return;
        var page = button.data('page');
        var chapter = button.data('chapter');
        var loader = jQuery('<img src="/img/loader.gif" class="right"/>');
        button.before(loader);
        var URL = page;
        if(chapter){
            URL += '/' + chapter;
        }
        jQuery.get('/events/pastevents/'+URL+'.json', function(data){
            loader.remove();
            if(!data || !data.data || !data.data.length){
                button.data('disabled', true);
                button.attr('disabled', true);
                button.text('Brak więcej spotkań');
                return;
            }
            var container = $('<div class="past-events"/>');
            var len = data.data.length;
            for(var i=0; i<len; i++){
                var event = data.data[i];
                var wrapper = $('<div class="event"/>');
                if(window.navigator.startActivity){
                    wrapper.append('<a class="right gbutton blue share-button-intent" data-url="'+event['Event']['url']+'" href="#">Udostępnij</a>');
                }
                wrapper.append($('<div class="name"/>').append('<a href="'+event['Event']['url']+'">'+event['Event']['name']+'</a>'));
                wrapper.append($('<div class="clearfix">'));
                var chapterImage = event['Chapter']['image'] ? '<img src="'+event['Chapter']['image']+'" class="chapter"/>' : '<span>'+event['Chapter']['name']+'</span>';
                wrapper.append($('<a href="'+event['Chapter']['url']+'" title="Idź do wizytówki '+event['Chapter']['name']+'" class="index-chapter-link"/>').append(chapterImage));
                wrapper.append('<div class="date">'+event['Event']['startdate']+'</div>');
                container.append(wrapper);
            }
            button.before(container);
            if(page===1){
                button.text('Załaduj więcej minionych spotkań');
            }
            button.data('page', page+1);
            if(!data.next){
                button.data('disabled', true);
                button.attr('disabled', true);
                button.text('Brak więcej spotkań');
            }
        }, 'json').error(function(e){
            console.log('error');
            loader.remove();
        });
    });
}

function handleGPlusEventsView(){
    jQuery('.gp-action .gp-scroll').click(function(e){
        e.preventDefault();
        var a = $(this);
        var wrapper = $('.gpe-desc-wrapper', a.parents('.gpe-desc'));
        var orygHeight = wrapper.data('orygHeight');
        var txt = a.data('txt').split('|');
        if(wrapper.data('expanded')){
            wrapper.css({
                'height': orygHeight
            });
            a.html(txt[0]);
            wrapper.data('expanded',false);
            return;
        }
        
        orygHeight = wrapper.height();
        wrapper.data('orygHeight',orygHeight);
        wrapper.data('expanded',true);
        wrapper.css({
            'height': wrapper.get(0)['scrollHeight']
        });
        a.html(txt[1]);
    });
}